/*-------------------------------------------------------------------------
 *
 * genericdesc.c
 *	  rmgr 描述例程，用于 access/transam/generic_xlog.c
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/backend/access/rmgrdesc/genericdesc.c
 *
 *-------------------------------------------------------------------------
 */
#include "postgres.h"

#include "access/generic_xlog.h"
#include "lib/stringinfo.h"
#include "storage/relfilenode.h"

/*
 * 通用xlog记录的描述：写入该记录覆盖的页面区域。
 */
void generic_desc(StringInfo fc_buf, XLogReaderState *fc_record)
{
	Pointer		fc_ptr = XLogRecGetData(fc_record),
				fc_end = fc_ptr + XLogRecGetDataLen(fc_record);

	while (fc_ptr < fc_end)
	{
		OffsetNumber fc_offset,
					fc_length;

		memcpy(&fc_offset, fc_ptr, sizeof(fc_offset));
		fc_ptr += sizeof(fc_offset);
		memcpy(&fc_length, fc_ptr, sizeof(fc_length));
		fc_ptr += sizeof(fc_length);
		fc_ptr += fc_length;

		if (fc_ptr < fc_end)
			appendStringInfo(fc_buf, "offset %u, length %u; ", fc_offset, fc_length);
		else
			appendStringInfo(fc_buf, "offset %u, length %u", fc_offset, fc_length);
	}
}

/*
 * 通用xlog记录的标识：我们不区分通用xlog记录中的任何子类型。
 */
const char * generic_identify(uint8 fc_info)
{
	return "Generic";
}
